﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Media;

namespace iNet.Windows
{
	/// <summary>
	/// 提供 DependencyObject 相關的延伸功能。
	/// </summary>
	public static class DependencyObjectExtensions
	{
		#region FindFirstVisualChild
		/// <summary>
		/// 使用深度優先搜尋法 (Depth-First Search) 尋找第一個符合指定型別的子視覺元素。
		/// </summary>
		/// <typeparam name="T">子視覺元素的型別。</typeparam>
		/// <param name="obj">根視覺元素。</param>
		/// <returns>第一個符合指定型別的子視覺元素。</returns>
		/// <exception cref="ArgumentNullException">obj 為 Null (Visual Basic 為 Nothing)。</exception>
		public static T FindFirstVisualChild<T>(this DependencyObject obj) where T : DependencyObject
		{
			//確認參數
			if (obj == null)
				throw new ArgumentNullException("obj");

			//搜尋第一層子視覺物件
			for (int i = 0, count = VisualTreeHelper.GetChildrenCount(obj); i < count; ++i)
			{
				DependencyObject child = VisualTreeHelper.GetChild(obj, i);
				if (child is T)
					return (child as T);
				child = child.FindFirstVisualChild<T>();
				if (child != null)
					return (child as T);
			}
			return null;
		}
		#endregion
		#region FindParent
		/// <summary>
		/// 搜尋第一個符合指定型別的父代視覺物件。
		/// </summary>
		/// <typeparam name="T">指定的父代視覺物件型別。</typeparam>
		/// <param name="obj">搜尋起始的視覺物件。</param>
		/// <returns>第一個符合指定型別的父代視覺物件，Null (Visual Basic 為 Nothing) 表示沒有符合的物件。</returns>
		public static T FindParent<T>(this DependencyObject obj) where T : DependencyObject
		{
			if (obj == null)
				return null;
			DependencyObject parent = VisualTreeHelper.GetParent(obj);
			while (parent != null && !(parent is T))
				parent = VisualTreeHelper.GetParent(parent);
			return (T)parent;
		}
		#endregion
	}
}
